perm filename DOVSER.MID[NET,MRC] blob
sn#544800 filedate 1980-10-29 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 X FCS FULTWX ECHOFF TERMID CORBEG TERSTR PDL COREND
C00004 00003 DOVSER CPYHST 1DIGTP NOTTIP
C00006 00004 GETCMD
C00007 00005 GETCM1 BROKET BROKT1 BROKT2 LINE1 LINE2 LINE3 GETCM3
C00009 00006 ETCRLF GETPTY GETPT1 SUICID ...LIT SVRRTS ERRTNS ERRHAN ERRINS HSTTAB HSTSIX
C00011 ENDMK
C⊗;
;X FCS FULTWX ECHOFF TERMID CORBEG TERSTR PDL COREND
TITLE DOVSER
SUBTTL Definitions
; Mark Crispin, SU-AI, October 1980
; Assembly switches
IFNDEF SVRSKT,SVRSKT==105 ; default listen socket
IFNDEF PDLLEN,PDLLEN==50 ; stack length
; AC definitions. 0→3 are used by NETWRK
X=4 ? A=5 ? B=6 ? P=17
; SAIL system bit definitions
FCS== 000020,, ; full character set mode
FULTWX==000004,, ; no echo
ECHOFF: 001400,,(FULTWX) ; echo off TTYSET command word
TERMID: 'TERMID ; for spies to see where we are
CORBEG==. ; start of initialized core storage
TERSTR: BLOCK 10. ; console location string
PDL: BLOCK PDLLEN ; stack
COREND==.-1 ; end of initialized storage
;DOVSER CPYHST 1DIGTP NOTTIP
SUBTTL Initialize the world
DOVSER: JFCL
RESET
MOVE ['DOVSER]
SETNAM
SETZM CORBEG
MOVE [CORBEG,,CORBEG+1]
BLT COREND
MOVE P,[PDL(-PDLLEN)]
MOVEI [DEBREAK ? JRST SUICID]
MOVEM JOBAPR
CLKINT 5.*60.*60. ; must die if around too long
OUTSTR [ASCIZ/DOVSER started
/]
; Listen for a connection on our socket
MOVEI SVRSKT
MOVEM LSNSKT
PUSHJ P,LISTEN
; Set up terminal id for interested spies
MOVEI TERMID
MOVEM JOBVER
; Log the connection
OUTSTR [ASCIZ/Connected to /]
PUSHJ P,MAPHST ; map in host table
MOVE HOST
PUSHJ P,HSTNUM ; get HDB
JFCL ; sorry about errors
MOVEI A,(1) ; host name
HRLI A,440700
SKIPA X,[440700,,TERSTR]
CPYHST: IDPB B,X
ILDB B,A
JUMPN B,CPYHST
HLRZ A,1 ; pointer to system name
MOVE B,(A) ; get system name
MOVE A,FSOCKT ; and ICP socket
CAMN B,[ASCII/TIP/] ; on a TIP?
TRNE A,177774 ; just paranoia; make sure a TIP port
JRST NOTTIP
MOVEI B,"#
IDPB B,X
LSH A,-16.
IDIVI A,8. ; ports are octal
JUMPE A,1DIGTP
ADDI A,"0 ? IDPB A,X
1DIGTP: ADDI B,"0 ? IDPB B,X
NOTTIP: PUSHJ P,SETANM ; set our job name
PUSHJ P,UNMHST ; map out the host table
OUTSTR TERSTR
OUTSTR [ASCIZ/
/]
;GETCMD
SUBTTL DOVER spooling over a PTY
; Get a PTY, set it up, and log it in
PTYGET A
JRST SUICID
MOVSI (A)
IORM ECHOFF
MOVSI B,(FCS)
PTSETL A ; set initial bits
HRROI ECHOFF
TTYSET ; echo off
MOVEI B,5 ; LOGIN
PTJOBX A
JRST SUICID
; Send command down PTY's throat
MOVEI B,[ASCIZ/ALIAS T,SYS
DELETE *.PRE
FTP FOO.PRE←/]
PTWRS7 A ; send prelude
GETCMD: PUSHJ P,NETICW
CAIGE 177 ; rubout or thing with parity bit?
CAIGE <" > ; or a control?
JRST GETCM1 ; better check this out
MOVE B,
PTWR1W A ; ordinary character, send it
JRST GETCMD
;GETCM1 BROKET BROKT1 BROKT2 LINE1 LINE2 LINE3 GETCM3
GETCM1: CAIE ↑M ; CR is okay though
JRST GETCMD ; ignore other controls
MOVE B,
PTWR1W A ; send that
PUSHJ P,NETICH ; eat the line feed
PTRD1W A ; and the one from the PTY too!
BROKET: PTRD1W A ; eat up to the third broket
CAIE B,"<
JRST BROKET
BROKT1: PTRD1W A
CAIE B,"<
JRST BROKT1
BROKT2: PTRD1W A
CAIE B,"<
JRST BROKT2
PTRD1W A
LINE1: PTRD1W A
MOVEI (B)
PUSHJ P,NETOCH
CAIE B,↑J
JRST LINE1
PUSHJ P,NETSND
LINE2: PTRD1W A
CAIE B,↑J
JRST LINE2
LINE3: PTRD1W A
CAIE B,↑J
JRST [ MOVEI (B)
PUSHJ P,NETOCH
JRST LINE3]
MOVEI (B)
PUSHJ P,NETOCH
PUSHJ P,NETSND
GETCM3: PTRD1W A ; eat until see a period
CAIE B,".
JRST GETCM3
MOVEI B,[ASCIZ/DOVER FOO.PRE
/]
PTWRS7 A ; send command
;ETCRLF GETPTY GETPT1 SUICID ...LIT SVRRTS ERRTNS ERRHAN ERRINS HSTTAB HSTSIX
ETCRLF: PTRD1W A
CAIE B,↑M
CAIN B,↑J
JRST ETCRLF
GETPTY: CAIE B,↑J ; end of reply line?
JRST [ MOVEI (B)
PUSHJ P,NETOCH ; send character to user
PTRD1W A
JRST GETPTY]
MOVEI (B)
PUSHJ P,NETOCH
GETPT1: PTRD1W A
CAIE B,".
JRST GETPT1
PUSHJ P,NETSND ; force buffer out
PUSHJ P,CLOSER
SUICID: RESET ? EXIT
...LIT: CONSTANTS
; Wonderful network routines
SVRRTS==-1 ; include server routines
ERRTNS==-1 ; include error routines
ERRHAN==-1 ; include automagic error handling
ERRINS==<JRST SUICID> ; error instruction
HSTTAB==-1 ; include host table magic
HSTSIX==-1 ; and alias name kludge
.INSRT NETWRK[NET,MRC]
END DOVSER